Magyar

Használja ki a GraphQL Föderáció erejét a Schema Stitching segítségével. Tanulja meg, hogyan építsen egységes GraphQL API-t több szolgáltatásból, javítva a skálázhatóságot és karbantarthatóságot.

GraphQL Föderáció: Schema Stitching - Részletes útmutató

A modern alkalmazásfejlesztés folyamatosan fejlődő világában a skálázható és karbantartható architektúrák iránti igény kiemelkedővé vált. A mikroszolgáltatások, eredendő modularitásukkal és független telepíthetőségükkel, népszerű megoldásként jelentek meg. Számos mikroszolgáltatás kezelése azonban bonyodalmakat okozhat, különösen, ha egységes API-t kell biztosítani a kliensalkalmazások számára. Itt lép a képbe a GraphQL Föderáció, és különösen a Schema Stitching.

Mi az a GraphQL Föderáció?

A GraphQL Föderáció egy hatékony architektúra, amely lehetővé teszi egyetlen, egységes GraphQL API létrehozását több mögöttes GraphQL szolgáltatásból (gyakran mikroszolgáltatásokat képviselve). Lehetővé teszi a fejlesztők számára, hogy több különböző szolgáltatáson keresztül kérdezzenek le adatokat, mintha azok egyetlen gráfot alkotnának, egyszerűsítve a kliensélményt és csökkentve a komplex vezénylési logika szükségességét a kliensoldalon.

A GraphQL Föderációnak két fő megközelítése van:

Ez a cikk a Schema Stitchingre fókuszál, feltárva annak koncepcióit, előnyeit, korlátait és gyakorlati megvalósítását.

A Schema Stitching megértése

A Schema Stitching több GraphQL séma egyetlen, koherens sémává történő összefűzésének folyamata. Ez az egységes séma egy homlokzatként működik, elrejtve a mögöttes szolgáltatások bonyolultságát a kliens elől. Amikor egy kliens kérést küld az összefűzött sémához, az átjáró intelligensen továbbítja a kérést a megfelelő mögöttes szolgáltatás(ok)hoz, lekéri az adatokat, és az eredményeket egyesíti, mielőtt visszaküldené azokat a kliensnek.

Gondoljon rá úgy, mint: van több étterme (szolgáltatása), amelyek mind különböző konyhákra specializálódtak. A Schema Stitching olyan, mint egy univerzális étlap, amely az összes étterem összes fogását egyesíti. Amikor egy vendég (kliens) rendel az univerzális étlapról, a rendelést intelligensen a megfelelő éttermi konyhákba irányítják, az ételt elkészítik, majd egyetlen szállítmányként egyesítik a vendég számára.

A Schema Stitching kulcsfogalmai

A Schema Stitching előnyei

A Schema Stitching számos meggyőző előnyt kínál a mikroszolgáltatási architektúrát alkalmazó szervezetek számára:

A Schema Stitching korlátai

Bár a Schema Stitching számos előnnyel jár, fontos tisztában lenni a korlátaival:

A Schema Stitching gyakorlati megvalósítása

Nézzünk meg egy egyszerűsített példát a Schema Stitching megvalósítására Node.js és a graphql-tools könyvtár (egy népszerű választás a schema stitchinghez) segítségével. Ez a példa két mikroszolgáltatást tartalmaz: egy Felhasználói Szolgáltatást (User Service) és egy Termék Szolgáltatást (Product Service).

1. A távoli sémák definiálása

Először definiálja a GraphQL sémákat mindkét távoli szolgáltatáshoz.

Felhasználói Szolgáltatás (user-service.js):


const { buildSchema } = require('graphql');

const userSchema = buildSchema(`
  type User {
    id: ID!
    name: String
    email: String
  }

  type Query {
    user(id: ID!): User
  }
`);

const users = [
  { id: '1', name: 'Alice Smith', email: 'alice@example.com' },
  { id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];

const userRoot = {
  user: (args) => users.find(user => user.id === args.id),
};

module.exports = {
  schema: userSchema,
  rootValue: userRoot,
};

Termék Szolgáltatás (product-service.js):


const { buildSchema } = require('graphql');

const productSchema = buildSchema(`
  type Product {
    id: ID!
    name: String
    price: Float
    userId: ID!  # Idegen kulcs a Felhasználói Szolgáltatáshoz
  }

  type Query {
    product(id: ID!): Product
  }
`);

const products = [
  { id: '101', name: 'Laptop', price: 1200, userId: '1' },
  { id: '102', name: 'Smartphone', price: 800, userId: '2' },
];

const productRoot = {
  product: (args) => products.find(product => product.id === args.id),
};

module.exports = {
  schema: productSchema,
  rootValue: productRoot,
};

2. Az átjáró szolgáltatás létrehozása

Most hozza létre az átjáró szolgáltatást, amely összefűzi a két sémát.

Átjáró Szolgáltatás (gateway.js):


const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');

async function createRemoteSchema(uri) {
  const fetcher = async (params) => {
    const response = await fetch(uri, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(params),
    });
    return response.json();
  };

  const schema = await introspectSchema(fetcher);
  return makeRemoteExecutableSchema({
    schema,
    fetcher,
  });
}

async function main() {
  const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
  const productSchema = await createRemoteSchema('http://localhost:4002/graphql');

  const stitchedSchema = stitchSchemas({
    subschemas: [
      { schema: userSchema },
      { schema: productSchema },
    ],
    typeDefs: `
      extend type Product {
        user: User
      }
    `,
    resolvers: {
      Product: {
        user: {
          selectionSet: `{ userId }`,
          resolve(product, args, context, info) {
            return info.mergeInfo.delegateToSchema({
              schema: userSchema,
              operation: 'query',
              fieldName: 'user',
              args: {
                id: product.userId,
              },
              context,
              info,
            });
          },
        },
      },
    },
  });

  const app = express();
  app.use('/graphql', graphqlHTTP({
    schema: stitchedSchema,
    graphiql: true,
  }));

  app.listen(4000, () => console.log('Átjáró szerver fut a http://localhost:4000/graphql címen'));
}

main().catch(console.error);

3. A szolgáltatások futtatása

A Felhasználói Szolgáltatást és a Termék Szolgáltatást különböző portokon kell futtatnia. Például:

Felhasználói Szolgáltatás (4001-es port):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4001, () => console.log('Felhasználói szolgáltatás fut a http://localhost:4001/graphql címen'));

Termék Szolgáltatás (4002-es port):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4002, () => console.log('Termék szolgáltatás fut a http://localhost:4002/graphql címen'));

4. Az összefűzött séma lekérdezése

Most már lekérdezheti az összefűzött sémát az átjárón keresztül (amely a 4000-es porton fut). Egy ehhez hasonló lekérdezést futtathat:


query {
  product(id: "101") {
    id
    name
    price
    user {
      id
      name
      email
    }
  }
}

Ez a lekérdezés lekéri a "101"-es azonosítójú terméket, és lekéri a hozzá tartozó felhasználót is a Felhasználói Szolgáltatásból, bemutatva, hogy a Schema Stitching hogyan teszi lehetővé az adatok lekérdezését több szolgáltatásból egyetlen kérésben.

Haladó Schema Stitching technikák

Az alapvető példán túl, íme néhány haladó technika, amelyekkel javíthatja a Schema Stitching implementációját:

Választás a Schema Stitching és az Apollo Föderáció között

Bár a Schema Stitching egy életképes opció a GraphQL Föderációhoz, az Apollo Föderáció vált a népszerűbb választássá a fejlett funkciói és a jobb fejlesztői élmény miatt. Íme a két megközelítés összehasonlítása:

Funkció Schema Stitching Apollo Föderáció
Séma definíció Meglévő GraphQL séma nyelvet használ Deklaratív séma nyelvet használ direktívákkal
Lekérdezés tervezés Manuális lekérdezés delegálást igényel Automatikus lekérdezés tervezés az Apollo Gateway által
Típus kiterjesztések Korlátozott támogatás Beépített támogatás a típus kiterjesztésekhez
Kulcs direktívák Nem támogatott Az @key direktívát használja az entitások azonosítására
Elosztott nyomkövetés Manuális implementációt igényel Beépített támogatás az elosztott nyomkövetéshez
Eszközök és ökoszisztéma Kevésbé kiforrott eszközök Kiforrottabb eszközök és nagy közösség
Bonyolultság Nagy rendszerekben bonyolult lehet kezelni Nagy és komplex rendszerekhez tervezték

Mikor válassza a Schema Stitchinget:

Mikor válassza az Apollo Föderációt:

Valós példák és használati esetek

Íme néhány valós példa arra, hogyan használható a GraphQL Föderáció, beleértve a Schema Stitchinget is:

A Schema Stitching bevált gyakorlatai

A sikeres Schema Stitching implementáció érdekében kövesse az alábbi bevált gyakorlatokat:

Következtetés

A GraphQL Föderáció a Schema Stitchinggel hatékony megközelítést kínál az egységes API-k létrehozására több szolgáltatásból egy mikroszolgáltatási architektúrában. A központi koncepciók, előnyök, korlátok és megvalósítási technikák megértésével kihasználhatja a Schema Stitchinget az adathozzáférés egyszerűsítésére, a skálázhatóság javítására és a karbantarthatóság növelésére. Bár az Apollo Föderáció egy fejlettebb megoldásként jelent meg, a Schema Stitching továbbra is életképes opció egyszerűbb forgatókönyvek esetén, vagy meglévő GraphQL szolgáltatások integrálásakor. Gondosan mérlegelje specifikus igényeit és követelményeit, hogy kiválassza a szervezetének legmegfelelőbb megközelítést.